package com.dragon.refect.classload;

import sun.misc.Launcher;

import java.io.Serializable;

/**
 * 在Oracle的Hotspot的实现中，系统属性sun.boot.class.path如果修改错了，则运行会出错，提示如下错信信息:
 * Error occurred during initialization of VM
 * java/lang/NoClassDefFoundError: java/lang/Object
 *
 * @author dragon
 * @since 2019/11/25
 */
public class MyTest12 {

    public static void main(String[] args) {
        System.out.println(System.getProperty("sun.boot.class.path"));
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println(System.getProperty("java.class.path"));
        /*
         * 内建于JVM中的启动类加载器会加载java.lang.ClassLoader以及其他的Java平台类，
         * 当JVM启动时，一块特殊的机器码会运行，他会加载扩展类加载器续系统类加载器，
         * 这块特殊的机器码就做启动类加载器(Bootstrap).
         *
         * 启动类加载器并不是Java类，而其他的加载器则都是Java类，
         * 启动类加载器是特定于平台的机器指令，它负责开启整个加载过程。
         *
         * 所有的类加载器(除了启动类加载器)都被实现为Java类。不过，总归要有一个组件来加载第一个Java类加载器，从而让整个加载过程能够顺利
         * 进行下去，加载第一个纯Java类加载器就是启动类加载器的职责。
         *
         * 启动类加载器还会负责加载提供JRE正常运行所需要的组件，这包括java.util与java.lang包中的类等等。
         */
        System.out.println(ClassLoader.class.getClassLoader());
        // 扩展类加载器与系统类加载器也是由启动类加载器所加载的
        System.out.println(Launcher.class.getClassLoader());
        System.out.println("----------------------------------");
        System.out.println(System.getProperty("java.system.class.loader"));
        System.out.println(MyTest12.class.getClassLoader());
        System.out.println(ClassLoader.getSystemClassLoader());
    }
}
